<?php

if (!defined('IN_TG')) {
    exit('Access decline');
}

/**
 * 将IP转为数字地址，并到数据库中查询IP对应地址信息
 * $ips = new IPtoRegion();   $cityname = $ips->show('192.168.3.3', 2);
 */

//建立对象类
class IPtoRegion
{
    /**
     * show 根据ip地址返回所属地区名称
     * @param string $ip
     * @param int 显示方式，1只返回城市，2返回城市及说明(中间加空格)，3只返回说明，4返回城市及说明(中间没有空格)
     * @return string 从数据库中查询到的地区名称或说明
     */
    public function show($ip, $convert_type = 1) {
        $ipnum = $this->ip_long($ip);
        // 是ip地址
        if ($ipnum) {
            // $dbconn = new DbMysql();
            $dbconn = new DbMyIP();
            $result = $dbconn->sql_fetch_assoc("SELECT CountryText,NETRemarks FROM resource_ip_library WHERE " . $ipnum . " between StartIPNum and EndIPNum LIMIT 1");
            if ($result == true) {
                // 在数据库中找到了
                $show_text = '';
                // $dbconn->sql_affected_rows("UPDATE resource_ip_library SET use_number=use_number+1, use_time='" . date('Y-m-d H:i:s') . "' WHERE " . $ipnum . " between StartIPNum and EndIPNum LIMIT 1");
                if ($convert_type == 1) { // 只返回城市
                    $show_text = $result['CountryText'];
                } elseif ($convert_type == 2) { // 返回城市及说明(中间加空格)
                    $show_text = $result['CountryText'] . ' ' . $result['NETRemarks'];
                } elseif ($convert_type == 3) { // 只返回说明
                    $show_text = $result['NETRemarks'];
                } elseif ($convert_type == 4) { // 返回城市及说明(中间没有空格)
                    $show_text = $result['CountryText'] . $result['NETRemarks'];
                }
                $dbconn->dbClose();
                return $show_text;
            } else {
                // 在数据库中没有找到
                $dbconn->dbClose();
                return '--';
            }
        }
        return '-';
        
    }

    /**
     * 连接数据库资句柄
     */
    private function is_ipv4($ip)
    {
        if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * IPTo_Int() IP地址转换成整数，推荐使用（ 但可以使用替代 ip2long('198.168.3.3') = 3332899587 ）
     * @param string $IP 查询的IP
     * @return int 数字格式
     */
    private function IPTo_Int($ip)
    {
        if (!$this->is_ipv4($ip)) {
            return false;
        } else {
            $ipArr  = explode('.', $ip);
            $ip = $ipArr[0] * 0x1000000
                + $ipArr[1] * 0x10000
                + $ipArr[2] * 0x100
                + $ipArr[3];
            return $ip;
        }
    }

    /**
     * IntTo_IP() 整数逆转IP地址，推荐使用（ 但可以使用替代 long2ip('3663451078') = 198.168.3.3 ）
     * @param integer $ipVal 转换的数字
     * @return string IP地址
     */
    private function IntTo_IP($ipVal)
    {
        $ipArr = array(0 => floor($ipVal / 0x1000000));
        $ipVint   = $ipVal - ($ipArr[0] * 0x1000000); //for clarity
        $ipArr[1] = ($ipVint & 0xFF0000)  >> 16;
        $ipArr[2] = ($ipVint & 0xFF00)  >> 8;
        $ipArr[3] =  $ipVint & 0xFF;
        $ipDotted = implode('.', $ipArr);
        return $ipDotted;
    }

    /**
     * ip_long() IP地址转换成整数，PHP系统自带ip2long方式
     * @param string $ip 查询的ip
     * @return int 数字格式
     */
    private function ip_long($ip)
    {
        if (!$this->is_ipv4($ip)) {
            return false;
        }
        $long = ip2long($ip);
        if ($long == -1 || $long === FALSE) {
            return false; // 无效的IP
        } else {
            return $long;
        }
    }

    /**
     * long_ip() 数字IP转换成IP地址，PHP系统自带long2ip方式
     * @param int $long 查询的数字格式
     * @return string 转换成功的IP地址
     */
    private function long_ip($long)
    {
        // 4294967295 是IP 255.255.255.255
        if ($long < 0 || $long > 4294967295) {
            return false;
        } else {
            $ip = long2ip($long);
            return $ip;
        }
    }

}

?>